// websocket.js
import { ElMessage } from 'element-plus'
//////////////////////////////////////////////////////////////////////////////////////
// 有心跳的  // 
  export class WebSocketService {
  constructor(wsUrl, reconnectAttempts = 3, reconnectDelay = 3000, heartbeatInterval = 30000) {
    this.wsUrl = wsUrl;  // WebSocket 服务器地址
    this.reconnectAttempts = reconnectAttempts;  // 最大重连次数
    this.reconnectDelay = reconnectDelay;  // 重连延迟（单位：毫秒）
    this.ws = null;  // WebSocket 实例
    this.currentReconnectAttempts = 0;  // 当前重连次数
    this.onMessageCallback = null;  // 接收到消息时的回调
    this.heartbeatInterval = heartbeatInterval;  // 心跳间隔（单位：毫秒）
    this.pingInterval = null;  // 心跳定时器
    this.isManuallyClosed = false;  // 标记为用户主动关闭
  }

  // 创建 WebSocket 连接
  createWebSocket() {
    return new Promise((resolve, reject) => {
      this.ws = new WebSocket(this.wsUrl);

      // 监听连接成功事件
      this.ws.onopen = () => {
        console.log("WebSocket 连接成功");
        this.currentReconnectAttempts = 0; // 重置重连次数
        this.startHeartbeat(); // 启动心跳
        resolve(true); // 通知连接成功
      };

      // 监听接收到的消息
      this.ws.onmessage = (event) => {
        // console.log("收到来自服务器的消息:", event.data);
        if (this.onMessageCallback) {
          this.onMessageCallback(event.data); // 执行传入的回调
        }
      };

      // 监听连接关闭事件
      this.ws.onclose = (event) => {
        console.log("WebSocket 连接关闭", event);
        this.stopHeartbeat(); // 停止心跳

        if (this.isManuallyClosed) {
          console.log("用户主动关闭连接，不再重连");
          this.isManuallyClosed = false;  // 重置标志
          return;  // 不再尝试重连
        }

        if (this.currentReconnectAttempts < this.reconnectAttempts) {
          this.currentReconnectAttempts++;
          setTimeout(() => {
            this.createWebSocket(); // 重试连接
          }, this.reconnectDelay);
        } else {
          reject(new Error("WebSocket 连接已关闭且达到最大重连次数"));
        }
      };

      // 监听错误事件
      this.ws.onerror = (error) => {
        console.error("WebSocket 连接错误:", error);
        reject(new Error("WebSocket 连接发生错误"));
      };
    });
  }

  // 设置接收到消息时的回调
  setOnMessageCallback(callback) {
    this.onMessageCallback = callback;
  }

  // 发送消息
  sendMessage(message) {
    if (this.ws && this.ws.readyState === WebSocket.OPEN) {
      this.ws.send(JSON.stringify(message));
    } else {
      // ElMessage.error("WebSocket 连接未建立，无法启动");
      console.error("WebSocket 连接未建立，无法发送消息");
    }
  }

  // 启动心跳定时器
  startHeartbeat() {
    this.pingInterval = setInterval(() => {
      this.sendMessage({ type: 'ping' });  // 发送 ping 消息
    }, this.heartbeatInterval);
  }

  // 停止心跳定时器
  stopHeartbeat() {
    if (this.pingInterval) {
      clearInterval(this.pingInterval);
      this.pingInterval = null;
    }
  }

  // 关闭 WebSocket 连接
  close() {
    if (this.ws) {
      this.isManuallyClosed = true;  // 标记为用户主动关闭
      this.ws.close(1000, "用户主动关闭连接");  // 正常关闭
      this.stopHeartbeat();  // 停止心跳定时器
    }
  }
}
